package com.wins.litemall.api;

import io.restassured.filter.Filter;
import io.restassured.filter.FilterContext;
import io.restassured.http.Header;
import io.restassured.response.Response;
import io.restassured.specification.FilterableRequestSpecification;
import io.restassured.specification.FilterableResponseSpecification;

import static com.wins.utils.LogUtils.logger;
import static io.qameta.allure.Allure.addAttachment;

// 问题1： 如果出现多个角色， 多个token 应该如何处理
//  多角色 -> litemall
// 问题2： 多次调用login 请求获取token，影响用例的执行效率
// 解决方案： 添加一个初始化token的方法， 并调用。 并添加一个初始化filter 的方法，传入token给filter。

public class ApiFilter implements Filter {
    //    public String token;
    // 问题： token 不仅值需要变化，key也需要变化
//    public String token;
    public Header tokenHeader;
    public ApiFilter(Header tokenHeader){
        this.tokenHeader = tokenHeader;
    }

    @Override
    public Response filter(FilterableRequestSpecification filterableRequestSpecification, FilterableResponseSpecification filterableResponseSpecification, FilterContext filterContext) {
        // 原始的请求信息
        // 添加一个头信息
//        filterableRequestSpecification.header("name", "ad");
        filterableRequestSpecification.contentType("application/json");
        // 问题 filter 依然需要token
//        filterableRequestSpecification.header("X-Litemall-Admin-Token", token);
        filterableRequestSpecification.header(tokenHeader);
        // 设置基地址 等于配置域名或ip
        filterableRequestSpecification.baseUri("https://litemall.hogwarts.ceshiren.com/");
        // 请求信息
        String requests_info = filterableRequestSpecification.getMethod() + " "
                + filterableRequestSpecification.getURI()
                + "\n Request Body =>"
                + filterableRequestSpecification.getBody();

        // 真实发起请求,获取响应对象
        Response response = filterContext.next(filterableRequestSpecification, filterableResponseSpecification);
        // 响应信息
        String response_info =
                "\n Response Status => "
                        + response.getStatusCode()
                        + " " + response.getStatusLine()
                        + "\n Response Body => " + response.getBody().asPrettyString();
        // ==== 日志的配置： 需求，每个接口再调用过程中，自动打印日志信息
        logger.debug("接口请求"+requests_info);
        // 并在allure报告上展示接口请求和响应日志
        addAttachment("接口请求", requests_info);

        logger.debug("接口响应"+response_info);
        addAttachment("接口响应", response_info);

        return response;


    }
}
